// 姓名、年龄、地址、身份证号码、联系方式、家庭地址、微信号
class Person {
  // 属性
  // 类上定义的属性一定是描绘这个类本身特征的变量，不能把一些无关的变量定义成类属性
  // public name:string |undefined; // typescript4.0之前属性如果没有赋值的解决办法，增加一个undefined数据类型
  public name: string = "noname"; // 赋初值为noname
  public age: number = 0;
  public phone: string = "1111";
  // public address: string[] = ["北京海定区西三环","四环","五环"];
  // public address:Array<string> = ["北京海定区西三环","四环","五环"]; // 泛型，数组类型的属性
  public resolve: () => void = () => {}; //【属于引用属性的一种】()=>void 函数类型，() => void = () => {} 给函数类型赋值
  // 对象的变量=实例的变量=类的【非静态的】属性=简称属性
  // 实例属性或者对象属性

  // 无参构造器
  // constructor(){}

  constructor(name_: string, age_: number, phone_: string) {
    this.name = name_;
    this.age = age_;
    this.phone = phone_;
  }

  // function 错误，类中定义方法不能用function

  // 付钱
  /* public play(): number {
    // return "df"; // 不能将类型“string”分配给类型“number”。
    return 3;
  } */

  // 吃饭
  public doEat(who: string, address: string): void {
    // 方法默认的返回值为void，建议加以下这个返回值
    console.log(`${this.name}和${who}吃饭，在${address}吃饭`);
  }

  public doStep() {}
}
// 给对象赋值的两种方式

// 方法1：通过类中属性或者方法来赋值
// 创建对象一共做了三件事
// 1. 在堆中为类的某个对象【示例】分配一个空间
// 2. 调用对应的构造函数【构造器】，并且把构造器中的各个参数值赋值给对象属性
// new Person()自动匹配无参数的构造器
// 3. 把对象赋值给对象变量【把实例赋值给实例变量】
// let zhangSanPerson = new Person();
// zhangSanPerson.name = "王五";
// zhangSanPerson.age = 23;
// zhangSanPerson.phone = "13456789090";

// zhangSanPerson.doEat("李四", "王府井");

// 方法2：通过构造函数【构造器】来赋值
let zhangSanPerson = new Person("zhangSan", 23, "13567897");
zhangSanPerson.doEat("李四", "王府井");

console.log(zhangSanPerson);
